package reflect;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * reflect:反射，反映
 * 反射机制是java的动态机制，允许程序在【运行期间】再确定如对象实例化，方法调用等操作
 * 这可以提到代码的灵活性和可扩展性，但是缺点是会降低程序的运行效率
 */

public class ReflectDemo {
    public static void main(String[] args) {

            /*
            反射的第一步是获取要操作的类的类对象：Class的实例
            JVM内部每个被加载的类都有且只有唯一的一个Class实例与之绑定。
            而Class实例被称为"类对象"，它记录了其表示的类的相关信息，如
            类名，有哪些方法，属性，构造器等等。
            因此通过获取一个类的类对象就可以反映出该类的相关信息，便于在运行期间
            进行相关的操作
            获取一个类的类对象的方式:
            1:类名.class
              Class cls = String.class;
              Class cls = int.class;
              注意:获取基本类型的类对象只有上述一种方式

            2:Class.forName(String className)
              通过指定一个类的完全限定名:包名.类名  形式获取一个类的类对象
              Class cls = Class.forName("java.lang.String");

            3:类加载器:ClassLoader

            4:对象.getClass()
         */

        //获取String的类对象
//        Class cls = String.class;
        Class cls = ArrayList.class;


        //通过类对象获取其表示的类的完全限定名
        String className = cls.getName();
        System.out.println(className);
        //通过类对象获取其表示的类的类名
        className = cls.getSimpleName();
        System.out.println(className);

        /*
          Package反射对象之一
            它的每一个实例用于表示一个包的信息
         */
        Package pack = cls.getPackage();
        String PName = pack.getName();
        System.out.println("包名:" + PName);

        /*
        Method 反射对象之一
        Method对象的每个实例用于表示一个方法的信息
         */
        Method[] methods = cls.getMethods();
        System.out.println("方法个数:" + methods.length);
        for (Method method : methods) {
            System.out.println(method.getName());
        }
    }
}
